package approval;

import java.util.ArrayList;

import org.apache.ibatis.session.SqlSession;

import common.ClampFactory;
import contract.ContractDAO;
import contract.ContractDTO;

public class ApprovalDAO {
	private SqlSession session;
	ApprovalDTO dto;
	ContractDTO cont = new ContractDTO();
	ContractDAO condao = new ContractDAO();
	
	// 페이징 관련 필드 ================================================
	int listSize = 3; 	// 한 페이지에 보여질 행 수
	int blockSize = 2; 	// 보여질 페이지 이동 번호 수..1 2 / 3 4 / 5 6 /...
	
	int totSize = 0; 	// 검색된 데이터 총 갯수
	int totPage = 0; 	// 전체 페이지 수
	int totBlock = 0; 	// 전체 블럭 수
	
	int nowPage = 1; 	// 현재 페이지
	int nowBlock = 1; 	// 현재 블럭
	
	int startNo = 1; 	// 목록의 시작 위치
	int endNo = 3; 		// 목록의 끝 위치
	
	int startPage = 1; 	// 현재 블럭의 시작 페이지 번호
	int endPage = 2; 	// 현재 블럭의 끝 페이지 번호
	// =================================================================
	
	public ApprovalDTO getDto() {
		return dto;
	}

	public void setDto(ApprovalDTO dto) {
		this.dto = dto;
	}
	

	public ApprovalDAO() { // 생성자에서 session open
		try {
			session = ClampFactory.getFactory().openSession();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	/**
	 * 전체 페이지 수 계산
	 */
	public void computePage(){
		totPage = (int)Math.ceil(totSize*1.0 / listSize); // ex)7/3=3
		totBlock = (int)Math.ceil(totPage*1.0/blockSize); // 1~2 : 1블럭 3~:2블럭
		nowBlock = (int)Math.ceil(nowPage*1.0/blockSize); // 3페이지/블럭사이즈:2 = 1.xx --> math.ceil ==> 2 :: nowBlock
		
		endPage = nowBlock * blockSize; // 4 * 2 = 8 
		startPage = endPage - blockSize + 1;
		if(totPage < endPage){ // 7 < 8 이면
			endPage = totPage;
		}
		
//		endNo = nowPage * listSize;
		dto.endNo = nowPage * listSize;
		dto.startNo = dto.endNo - listSize+1;
//		startNo = endNo - listSize+1;
		if(totSize < dto.endNo){
			dto.endNo = totSize;
		}
	}
	
	/**
	 * 전체 리스트 및 검색 리스트 조회 쿼리
	 * @return ArrayList
	 */
	public ArrayList<ApprovalDTO> list(){
		//System.out.println("▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶ApprovalDAO.list() 실행");
		ArrayList<ApprovalDTO> list = null;
		try {
			if(dto.getFind() != null) //System.out.println("dao.list()로 find 넘김 : "+dto.getFind());
			/*System.out.println("nowPage는 몇? : "+dto.getNowPage());
			
			System.out.println("totSize구한당");
			totSize = (int)session.selectOne("approval.computePage");
			System.out.println("totSize쿼리타구왔당");
			computePage();*/
			
		/*	System.out.println("A" + dto.getSa_no_nm());
			System.out.println("B" + dto.getCt_no());
			System.out.println("C" + dto.getCt_ing());
			System.out.println("D" + dto.getAp_sdt());
			System.out.println("E" + dto.getAp_edt());
			System.out.println("F" + dto.getAp_req_sa_nm());
			System.out.println("G" + dto.getAp_ap_sa_nm());*/
			list = (ArrayList<ApprovalDTO>) session.selectList("approval.list", dto);
			//System.out.println("dao.list.size() : "+list.size());
			session.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		//System.out.println("ApprovalDAO.list() 완료◁◁◁◁◁◁◁◁◁◁◁◁◁◁◁◁◁◁");
		return list;
	}
	
	/**
	 * 팝업창에서 한 건 조회 쿼리
	 * @param ap_no
	 * @return ApprovalDTO
	 */
	public ApprovalDTO ap_popup(String ap_no){
		ApprovalDTO dto = null;
		try {
			dto = (ApprovalDTO) session.selectOne("approval.pop", ap_no);
			session.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return dto;
	}
	
	/**
	 * 팝업창에서 결재 요청 누르면 결재 데이터 INSERT 쿼리
	 * @return int
	 */
	public int insert(){
		//System.out.println("▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶▶ApprovalDAO.insert() 실행");
		int cnt = 0;
		try {
			//System.out.println("ap_no from ApprovalDAO : "+dto.getAp_no());
			cnt = session.insert("approval.insert", dto);
			
			//스케쥴 모둘을 콜해줘야 스케줄이 생성이됨...
			
			//계약원장에 대출시작일? 결재번호? 하여간 추가로 계약원장에 값 메꿔주기..
			
			session.commit();
			session.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		//System.out.println("ApprovalDAO.insert() 완료◁◁◁◁◁◁◁◁◁◁◁◁◁◁◁◁◁◁");
		return cnt;
	}
	
	/**
	 * 팝업창에서 승인|부결|반려를 눌렀을 때 UPDATE 쿼리
	 * @return int
	 */
	public int update(String gubun){
		int cnt = 0;
		try {
			/*System.out.println("ap_no from ApprovalDAO : " + dto.getAp_no());
			System.out.println("계약번호: "+dto.getCt_no());
			System.out.println("진행코드: "+dto.getCt_ing());
			System.out.println("결재내용: "+dto.getAp_content());*/
			if("03".equals(gubun)){
				//System.out.println("승인하려고?");
				cnt = session.update("approval.update03", dto);	
				//System.out.println("ct_no : " + dto.getCt_no());
				//System.out.println("ct_ing : " + dto.getCt_ing());
				
				/* From Mirme */
				cont.setCt_no(dto.getCt_no());
				cont.setCt_ing("03");
				cont.setPd_prd(dto.getPd_prd());
				condao.setCont(cont);
				condao.appUp();
				
				
			}else if("04".equals(gubun)){
				//System.out.println("부결하려고?");
				cnt = session.update("approval.update04", dto);
				
				/* From Mirme */
				cont.setCt_no(dto.getCt_no());
				cont.setCt_ing("04");
				condao.setCont(cont);
				condao.appUp();				

			}else if("05".equals(gubun)){
				//System.out.println("반려하려고?");
				cnt = session.update("approval.update05", dto);
				/* From Mirme */
				cont.setCt_no(dto.getCt_no());
				cont.setCt_ing("05");
				condao.setCont(cont);
				condao.appUp();	
			}
			session.commit();
			session.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return cnt;
	}
	
	// 페이지 분리와 관련된 메소드==================
		public int getListSize() {
			return listSize;
		}

		public void setListSize(int listSize) {
			this.listSize = listSize;
		}

		public int getBlockSize() {
			return blockSize;
		}

		public void setBlockSize(int blockSize) {
			this.blockSize = blockSize;
		}

		public int getTotSize() {
			return totSize;
		}

		public void setTotSize(int totSize) {
			this.totSize = totSize;
		}

		public int getTotPage() {
			return totPage;
		}

		public void setTotPage(int totPage) {
			this.totPage = totPage;
		}

		public int getTotBlock() {
			return totBlock;
		}

		public void setTotBlock(int totBlock) {
			this.totBlock = totBlock;
		}

		public int getNowPage() {
			return nowPage;
		}

		public void setNowPage(int nowPage) {
			this.nowPage = nowPage;
		}

		public int getNowBlock() {
			return nowBlock;
		}

		public void setNowBlock(int nowBlock) {
			this.nowBlock = nowBlock;
		}

		public int getStartNo() {
			return startNo;
		}

		public void setStartNo(int startNo) {
			this.startNo = startNo;
		}

		public int getEndNo() {
			return endNo;
		}

		public void setEndNo(int endNo) {
			this.endNo = endNo;
		}

		public int getStartPage() {
			return startPage;
		}

		public void setStartPage(int startPage) {
			this.startPage = startPage;
		}

		public int getEndPage() {
			return endPage;
		}

		public void setEndPage(int endPage) {
			this.endPage = endPage;
		}
		//=============================================
	
}
